----- Original Message ----- From: SLY To: kaev@yandex.ru Sent: Wednesday, July 26, 2000 7:15 PM Subject: MFCByStep Привет всем ! Посылаю пример организации градиентной заливки контекста окна. Пример реализован для диалогового окна но может быть применен где угодно так как сама заливка реализована в виде функции GradientFillRect
Вот как она выглядит:

Давайте посмотрим код. Реализуется эта заливка в функции OnPaint. То есть при перерисовке диалогового окна вызывается функция GradientFillRect.
void CGradientDlg::OnPaint()
{
if (IsIconic())
{
.........
}
else
{
CPaintDC dc(this); // получаем контекст устройтсва для рисования
CRect rect;
GetClientRect(rect); // получаем размер области рисования
// вызываем функцию рисования
GradientFillRect(dc.GetSafeHdc(),rect,RGB(255,0,0),RGB(0,0,255),128);
}
}
Теперь при изменении размера окна вызывется перерисовка, используя Invalidate в ответ на сообщение WM_SIZE.
void CGradientDlg::OnSize(UINT nType, int cx, int cy)
{
CDialog::OnSize(nType, cx, cy);
//обновить при изменении размеров
Invalidate();
}
Ну вот и сама функция:
void CGradientDlg::GradientFillRect(HDC pDC, CRect ARect,
COLORREF StartColor,COLORREF EndColor, int Colors)
{
//если квадрат пустой то выйти
if (ARect.IsRectEmpty()) return;
HBRUSH Brush;
//если кол-во цветов меньше двух то закрасить первым цветом и выйти
if (Colors < 2)
{
Brush = CreateSolidBrush(StartColor);
FillRect(pDC, ARect, Brush);
DeleteObject(Brush);
return;
}
BYTE StartRGB[3];
int RGBDelta[3];
CRect ColorBand;
int I,Delta;
//начальные состовляющие цвета
StartRGB[0] = GetRValue(StartColor);
StartRGB[1] = GetGValue(StartColor);
StartRGB[2] = GetBValue(StartColor);
//шаг изменения цвета
RGBDelta[0] = GetRValue(EndColor) - StartRGB[0];
RGBDelta[1] = GetGValue(EndColor) - StartRGB[1];
RGBDelta[2] = GetBValue(EndColor) - StartRGB[2];
ColorBand = ARect;
Colors = max(2, min(Colors, ARect.Height()));
Delta = (int)(ARect.Height() / Colors);
//закрасить основную часть окна
if (Delta>0)
for (I=0;I<Colors;I++)
{
ColorBand.top = ARect.top + I * Delta;
ColorBand.bottom = ColorBand.top + Delta;
Brush = CreateSolidBrush(RGB(
StartRGB[0] + MulDiv(I, RGBDelta[0], Colors - 1),
StartRGB[1] + MulDiv(I, RGBDelta[1], Colors - 1),
StartRGB[2] + MulDiv(I, RGBDelta[2], Colors - 1)));
FillRect(pDC, ColorBand, Brush);
DeleteObject(Brush);
}
//закрасить оставшуюся часть окна
div_t Res;
Res=div(ARect.Height() , Colors);
Delta =Res.rem;//остаток от деления
if (Delta>0)
for (I=0;I<Colors;I++)
{
ColorBand.top = ARect.bottom - Delta;
ColorBand.bottom = ColorBand.top + Delta;
Brush = CreateSolidBrush(EndColor);
FillRect(pDC, ColorBand, Brush);
DeleteObject(Brush);
}
}
Вот так оно и красится. Если есть еще вопросы смотрите проект.
Материалы для шага прислал SLY (mailto:sly@vmz.nnov.ru?SUBJECT=FromFirstStepSite).